home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / NRHDR.C < prev    next >
C/C++ Source or Header  |  1996-08-29  |  3KB  |  143 lines

  1. /* Functions for level 3 net/rom support
  2.  * Copyright 1989 Dan Frank, W9NK
  3.  */
  4. #include "global.h"
  5. #ifdef NETROM
  6. #include "mbuf.h"
  7. #include "timer.h"
  8. #include "ax25.h"
  9. #include "netrom.h"
  10.  
  11. #if !defined(_lint)
  12. static char rcsid[] OPTIONAL = "$Id: nrhdr.c,v 1.7 1996/08/29 12:11:16 root Exp root $";
  13. #endif
  14.  
  15.  
  16. /* Convert a net/rom network header to host format structure
  17.  * Return -1 if error, 0 if OK
  18.  */
  19.  
  20. int
  21. ntohnr3 (hdr, bpp)
  22. register struct nr3hdr *hdr;    /* output structure */
  23. struct mbuf **bpp;
  24. {
  25. int ttl;
  26.  
  27.     if (pullup (bpp, (unsigned char *) hdr->source, AXALEN) < AXALEN)
  28.         return -1;
  29.  
  30.     if (pullup (bpp, (unsigned char *) hdr->dest, AXALEN) < AXALEN)
  31.         return -1;
  32.  
  33.     if ((ttl = PULLCHAR (bpp)) == -1)
  34.         return -1;
  35.  
  36.     hdr->ttl = (int16) ttl;
  37.  
  38.     return 0;
  39. }
  40.  
  41.  
  42. /* Convert a host-format net/rom level 3 header into an mbuf ready
  43.  * for transmission.
  44.  */
  45.  
  46. struct mbuf *
  47. htonnr3 (register struct nr3hdr *hdr)
  48. {
  49. struct mbuf *rbuf;
  50. register char *cp;
  51.  
  52.     if (hdr == (struct nr3hdr *) NULL)
  53.         return NULLBUF;
  54.  
  55.     /* Allocate space for return buffer */
  56.     if ((rbuf = alloc_mbuf (NR3HLEN)) == NULLBUF)
  57.         return NULLBUF;
  58.  
  59.     rbuf->cnt = NR3HLEN;
  60.  
  61.     /* Now convert */
  62.     cp = (char *) rbuf->data;
  63.  
  64.     memcpy (cp, hdr->source, AXALEN);
  65.     cp[ALEN] &= ~E;        /* source E-bit is always off */
  66.     cp += AXALEN;
  67.     memcpy (cp, hdr->dest, AXALEN);
  68.     cp[ALEN] |= E;        /* destination E-bit always set */
  69.     cp += AXALEN;
  70.     *cp = (char) hdr->ttl;
  71.  
  72.     return rbuf;
  73. }
  74.  
  75.  
  76. /* Convert a net/rom routing broadcast destination subpacket from
  77.  * network format to a host format structure.  Return -1 if error,
  78.  * 0 if OK.
  79.  */
  80. int
  81. ntohnrdest (register struct nr3dest *ds, struct mbuf **bpp)
  82. {
  83. int quality;
  84.  
  85.     /* get destination callsign */
  86.     if (pullup (bpp, (unsigned char *) ds->dest, AXALEN) < AXALEN)
  87.         return -1;
  88.  
  89.     /* get destination alias */
  90.     if (pullup (bpp, (unsigned char *) ds->alias, ALEN) < ALEN)
  91.         return -1;
  92.     ds->alias[ALEN] = '\0';
  93.  
  94.     /* get best neighbor callsign */
  95.     if (pullup (bpp, (unsigned char *) ds->neighbor, AXALEN) < AXALEN)
  96.         return -1;
  97.  
  98.     /* get route quality */
  99.     if ((quality = PULLCHAR (bpp)) == -1)
  100.         return -1;
  101.     ds->quality = uchar (quality);
  102.  
  103.     return 0;
  104. }
  105.  
  106.  
  107. /* Convert a host-format net/rom destination subpacket into an
  108.  * mbuf ready for transmission as part of a route broadcast
  109.  * packet.
  110.  */
  111. struct mbuf *
  112. htonnrdest (register struct nr3dest *ds)
  113. {
  114. struct mbuf *rbuf;
  115. register char *cp;
  116.  
  117.     if (ds == (struct nr3dest *) NULL)
  118.         return NULLBUF;
  119.  
  120.     /* Allocate space for return buffer */
  121.     if ((rbuf = alloc_mbuf (NRRTDESTLEN)) == NULLBUF)
  122.         return NULLBUF;
  123.  
  124.     rbuf->cnt = NRRTDESTLEN;
  125.  
  126.     cp = (char *) rbuf->data;
  127.  
  128.     memcpy (cp, ds->dest, AXALEN);
  129.     cp += AXALEN;
  130.  
  131.     memcpy (cp, ds->alias, ALEN);
  132.     cp += ALEN;
  133.  
  134.     memcpy (cp, ds->neighbor, AXALEN);
  135.     cp += AXALEN;
  136.  
  137.     *cp = (char) ds->quality;
  138.  
  139.     return rbuf;
  140. }
  141.  
  142. #endif /* NETROM */
  143.